function getCookie(name){  
 var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));  
 if(arr != null) return unescape(arr[2]); return '';  
}  
  
function savecookie(cookiename,dc){   
 var cdc = json_encode(dc);  
 setCookie(cookiename, cdc);  
}  
function setCookie(name, value){  
 document.cookie = name + "="+ value;  
}   
function clearcookie(cookiename){  
 setCookie(cookiename, '');  
}  
  
function readcookie(cookiename){  
 var cdc = getCookie(cookiename);  
 cdc = cdc.replace(/,_/g, ',');  
 cdc = cdc.replace(/{_/g, '{');  
 cdc = cdc.replace(/_}/g, '}');
return cdc;
 
}  
  
function json_decode(str_json) {  

    var json = this.window.JSON;  
    if (typeof json === 'object' && typeof json.parse === 'function') {  
        return json.parse(str_json);  
    }  
  
    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;  
    var j;  
    var text = str_json;  
  
    cx.lastIndex = 0;  
    if (cx.test(text)) {  
        text = text.replace(cx, function (a) {  
            return '\\u' +  
            ('0000' + a.charCodeAt(0).toString(16)).slice(-4);  
        });  
    }  

    if (/^[\],:{}\s]*$/.  
        test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').  
            replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').  
            replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {  
  

  
        j = eval('(' + text + ')');  
  
        return j;  
    }  
  
    throw new SyntaxError('json_decode');  
}  
  
function json_encode(mixed_val) {   
    var json = this.window.JSON;  
    if (typeof json === 'object' && typeof json.stringify === 'function') {  
        return json.stringify(mixed_val);  
    }  
  
    var value = mixed_val;  
  
    var quote = function (string) {  
        var escapable = /[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;  
        var meta = {    // table of character substitutions  
            '\b': '\\b',  
            '\t': '\\t',  
            '\n': '\\n',  
            '\f': '\\f',  
            '\r': '\\r',  
            '"' : '\\"',  
            '\\': '\\\\'  
        };  
  
        escapable.lastIndex = 0;  
        return escapable.test(string) ?  
        '"' + string.replace(escapable, function (a) {  
            var c = meta[a];  
            return typeof c === 'string' ? c :  
            '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);  
        }) + '"' :  
        '"' + string + '"';  
    };  
  
    var str = function(key, holder) {  
        var gap = '';  
        var indent = '    ';  
        var i = 0;     
        var k = '';        
        var v = '';     
        var length = 0;  
        var mind = gap;  
        var partial = [];  
        var value = holder[key];  

        if (value && typeof value === 'object' &&  
            typeof value.toJSON === 'function') {  
            value = value.toJSON(key);  
        }  
 
        switch (typeof value) {  
            case 'string':  
                return quote(value);  
  
            case 'number':  
                return isFinite(value) ? String(value) : 'null';  
  
            case 'boolean':  
            case 'null':  
 
                return String(value);  
  
            case 'object':  
                if (!value) {  
                    return 'null';  
                }  
                gap += indent;  
                partial = [];  
                if (Object.prototype.toString.apply(value) === '[object Array]') {   
                    length = value.length;  
                    for (i = 0; i < length; i += 1) {  
                        partial[i] = str(i, value) || 'null';  
                    }   
                    v = partial.length === 0 ? '[]' :  
                    gap ? '[\n' + gap +  
                    partial.join(',\n' + gap) + '\n' +  
                    mind + ']' :  
                    '[' + partial.join(',') + ']';  
                    gap = mind;  
                    return v;  
                }   
                for (k in value) {  
                    if (Object.hasOwnProperty.call(value, k)) {  
                        v = str(k, value);  
                        if (v) {  
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);  
                        }  
                    }  
                }  
                v = partial.length === 0 ? '{}' :  
                gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +  
                mind + '}' : '{' + partial.join(',') + '}';  
                gap = mind;  
                return v;  
        }  
    };  
  
   
    return str('', {  
        '': value  
    });  
}  

function base64_decode( data ) {  

  
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";  
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, dec = "", tmp_arr = [];  
  
    if (!data) {  
        return data;  
    }  
  
    data += '';  
  
    do {  
        h1 = b64.indexOf(data.charAt(i++));  
        h2 = b64.indexOf(data.charAt(i++));  
        h3 = b64.indexOf(data.charAt(i++));  
        h4 = b64.indexOf(data.charAt(i++));  
  
        bits = h1<<18 | h2<<12 | h3<<6 | h4;  
  
        o1 = bits>>16 & 0xff;  
        o2 = bits>>8 & 0xff;  
        o3 = bits & 0xff;  
  
        if (h3 == 64) {  
            tmp_arr[ac++] = String.fromCharCode(o1);  
        } else if (h4 == 64) {  
            tmp_arr[ac++] = String.fromCharCode(o1, o2);  
        } else {  
            tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);  
        }  
    } while (i < data.length);  
  
    dec = tmp_arr.join('');  
    dec = this.utf8_decode(dec);  
  
    return dec;  
}  
  
function base64_encode( data ) { 
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";  
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, enc="", tmp_arr = [];  
  
    if (!data) {  
        return data;  
    }  
  
    data = this.utf8_encode(data+'');  
  
    do { 
        o1 = data.charCodeAt(i++);  
        o2 = data.charCodeAt(i++);  
        o3 = data.charCodeAt(i++);  
  
        bits = o1<<16 | o2<<8 | o3;  
  
        h1 = bits>>18 & 0x3f;  
        h2 = bits>>12 & 0x3f;  
        h3 = bits>>6 & 0x3f;  
        h4 = bits & 0x3f;  
        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);  
    } while (i < data.length);  
  
    enc = tmp_arr.join('');  
  
    switch( data.length % 3 ){  
        case 1:  
            enc = enc.slice(0, -2) + '==';  
        break;  
        case 2:  
            enc = enc.slice(0, -1) + '=';  
        break;  
    }  
  
    return enc;  
}  
  
function utf8_encode ( argString ) {   
    var string = (argString+'').replace(/\r\n/g, "\n").replace(/\r/g, "\n");  
  
    var utftext = "";  
    var start, end;  
    var stringl = 0;  
  
    start = end = 0;  
    stringl = string.length;  
    for (var n = 0; n < stringl; n++) {  
        var c1 = string.charCodeAt(n);  
        var enc = null;  
  
        if (c1 < 128) {  
            end++;  
        } else if((c1 > 127) && (c1 < 2048)) {  
            enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);  
        } else {  
            enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);  
        }  
        if (enc !== null) {  
            if (end > start) {  
                utftext += string.substring(start, end);  
            }  
            utftext += enc;  
            start = end = n+1;  
        }  
    }  
  
    if (end > start) {  
        utftext += string.substring(start, string.length);  
    }  
  
    return utftext;  
}  
  
function utf8_decode ( str_data ) {  
    var tmp_arr = [], i = 0, ac = 0, c1 = 0, c2 = 0, c3 = 0;  
  
    str_data += '';  
  
    while ( i < str_data.length ) {  
        c1 = str_data.charCodeAt(i);  
        if (c1 < 128) {  
            tmp_arr[ac++] = String.fromCharCode(c1);  
            i++;  
        } else if ((c1 > 191) && (c1 < 224)) {  
            c2 = str_data.charCodeAt(i+1);  
            tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));  
            i += 2;  
        } else {  
            c2 = str_data.charCodeAt(i+1);  
            c3 = str_data.charCodeAt(i+2);  
            tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));  
            i += 3;  
        }  
    }  
  
    return tmp_arr.join('');  
} 